<?php
/**
 * Created by PhpStorm.
 * User: cc
 * Date: 2023/4/14
 * Time: 11:04 AM
 */

namespace app\common\lib\util;

use think\Controller;

class Time extends Controller
{

    /**
     * 取指定时区的日期
     * @param $timezone
     * @param $timestamp
     * @param $format
     * @return string
     * @throws \Exception
     */
    public static function convertTimezone($timezone, $timestamp, $format)
    {
        // 校验时区参数是否为数字且在-12到12之间
        if (!is_numeric($timezone) || $timezone < -12 || $timezone > 12)
        {
            return 'Time zone parameter error!';
        }
        // 获取服务器当前时区
        $server_timezone = date_default_timezone_get();
        // 创建DateTime对象，使用服务器当前时区和传入的时间戳
        $date = new \DateTime('now', new \DateTimeZone($server_timezone));
        $date->setTimestamp($timestamp);
        // 计算目标时区与UTC的时间差
        $time_diff = $timezone >= 0 ? '+' . $timezone : $timezone;
        $time_diff .= ':00';
        // 设置目标时区
        $date->setTimezone(new \DateTimeZone($time_diff));
        // 返回转换后的时间，按照指定格式进行格式化
        return $date->format($format);
    }

    /**
     * 获取距离当前时间一定时间段的所有时间
     * @param string $dateString 指定日期  如:2023-04-16
     * @param int $range 时间范围 天数 如: 7 | 30
     * @param string $dateFormat 时间格式 如:Y-m-d
     * @param int $num 时间跨度 如: 1 | 7
     * @return array
     * @throws \Exception
     */
    public static function getNowTimeTimeRange(string $dateString = '', int $range = 0, string $dateFormat = '', int $num = 1): array
    {
        // 创建当前时间日期对象
        $now = new \DateTime($dateString);
        // 创建间隔对象，表示 num 天的时间跨度
        $interval = new \DateInterval("P{$num}D");
        // 创建空数组保存所有日期
        $dateArray = [];

        // 循环计算近 30 天的日期
        for ($i = 0; $i < $range; $i++)
        {
            // 创建新的时间日期对象，表示当前时间加上 i 天的间隔后的日期
            $date = $now->sub($interval)->format($dateFormat ?: 'Y-m-d');

            $timeTmp = strtotime($date);
            // 将日期添加到数组中
            $dateArray[$timeTmp] = $dateFormat ? $date : $timeTmp;
        }
        return $dateArray;
    }

    /**
     * 获取指定日期的几个月内所有时间
     * @param string $dateString 指定日期 如:2023-04-16 | 2023-04
     * @param int $monthNum 几个月 如: 3 | 6
     * @param string $dateFormat
     * @param int $type 1=>当前日期前几个月 2=>当前日期后几个月
     * @return array
     * @throws \Exception
     */
    public static function getNowTimeMonthRange(string $dateString, int $monthNum, string $dateFormat = '', int $type = 1)
    {
        // 创建日期对象
        $date = new \DateTime($dateString);
        // 创建空数组保存所有日期
        $dateArray = [];

        // 循环计算近 3 个月的日期
        for ($i = 0; $i < $monthNum; $i++)
        {
            // 获取当前日期所在月份的总天数
            $daysInMonth = $date->format('t');

            // 循环计算当前月份的所有日期
            for ($j = 1; $j <= $daysInMonth; $j++)
            {
                // 创建新的日期对象，表示当前日期的第 j 天
                $newDate = clone $date;
                $newDate->setDate($date->format('Y'), $date->format('n'), $j);

                // 将日期添加到数组中
                $dateArray[] = $dateFormat ? $newDate->format($dateFormat) : strtotime($newDate->format('Y-m-d'));
            }
            // 当前日期减少一个月
            if ($type === 1)
            {
                $date->sub(new \DateInterval('P1M'));
            } else
            {
                $date->add(new \DateInterval('P1M'));
            }
        }
        return $dateArray;
    }
}
